昨天談到了Active Record的基本介紹,知道了Active Record是一種設計模式,應用到了ORM技術,將程式語言中的物件對應到了資料庫中的資料表,而Rails中的Model就是依照Active Record所設計出來的產物。再來深入了解有關Active Record的面試題吧!
How does Rails manage database state?
Rails怎麼管理資料庫狀態?
要回答這個問題,首先得搞清楚什麼是資料庫狀態(database state)。
資料庫狀態(database state)是指某個時刻當時的資料庫內容,進入、修改、刪除資訊都會改變資料庫狀態。
那Rails又是如果管理的呢?
Rails提供了一種方式叫migration來管理資料庫,可以想像成每一個migration都是一個新的資料庫版本,一開始資料庫什麼都沒有,藉由每一個migration檔案增加或刪除資料表、欄位等等。
這樣一來,Active Record就可以根據migration的先後順序知道要如何更新你的資料庫到最新的版本。
以下是一個migration檔案的範例
class CreateProducts < ActiveRecord::Migration[5.0]
def change
create_table :products do |t|
t.string :name
t.text :description
t.timestamps
end
end
end
這個migration檔,會創造一個products
資料表,裡面有一個string
的欄位是name
和一個text
欄位叫做description
。另外還會有一個內建的欄位id
來記錄流水編號,timestamps
還會幫我們多加兩個欄位created at
跟updated at
分別紀錄資料寫入與更新的時間。
假設資料庫裡一開始什麼都沒有,那當我們執行rails db:migrate
後,就會生成上述的資料表與欄位,同時migration也支持倒退的行為,輸入rails db:rollback
,就會將最新的migration退回,不過這招要小心使用,不要在已經跑好一段時間欄位與資料用這招,另外新增一個migration來處理會是更好的方式。
上面這一個migration是不分資料庫類型的,不管是MySQL、PostgreSQL、 Oracle或其他都是可以正常運作的。
這些migration檔案提供了Active Record指引,讓它知道如何去修改現有的資料庫,也因為如此,非常不建議去刪除或修改之前的migration檔案,常會使資料庫出問題。
當我們Rails中要產生一個Model時,會輸入像以下的指令
$ rails generate model Product name:string description:text
除了產生Product
這個model外,Rails也會很貼心的幫我們生成一個對應的migration檔。
class CreateProducts < ActiveRecord::Migration[5.0]
def change
create_table :products do |t|
t.string :name
t.text :description
t.timestamps
end
end
end
而當我們跑下rails db:migrate
後,我們的資料庫會生成products
資料表對應到Product
這個Class(或說Model),而當我們Product 這個Class製造(create)一個實體(物件)時,資料表也同時會寫入一筆資料,這就是Active Record幫我們做的好事。
這樣有沒有對於Active Record與migration之間的關係更加清楚了呢,明天來持續相關的面試題吧。
Rails提供了一種很方便的方法叫做migration來改變資料庫狀態。開發者靠著migration來指引Active Record如何修改現有的資料庫,增加或刪除資料表、欄位等等。
2.Rubyguide-ActiveRecord_Migration